package com.mm.base.redis;

import cn.hutool.core.util.StrUtil;
import com.mm.domain.taxi.DTaxiOrderInfo;
import com.mm.serivce.mp.TaxiOrderInfoService;
import com.mm.serivce.taxi.IDTaxiOrderInfoService;
import com.mm.util.common.CommonKey;
import com.mm.util.common.RedisKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * 描述: 定义监听器 RedisKeyExpirationListener，
 * 实现KeyExpirationEventMessageListener 接口，
 * 查看源码发现，该接口监听所有 db 的过期事件 keyevent@*:expired"
 *
 * @author: yanglin
 * @Date: 2021-08-22-9:14
 * @Version: 1.0
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    @Autowired
    TaxiOrderInfoService orderInfoService;

    public RedisKeyExpirationListener(RedisMessageListenerContainer container) {
        super(container);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = message.toString();
        // 判断订单过期Key
        if (expiredKey.indexOf(RedisKey.ORDER_INFO.getValue()) > 0) {
            // 订单状态(10-已创建(乘客发单) 20-已接单(司机接单) 30-待出发(司机抵达出发点)
            // 40-待抵达(司机已接到乘客/行驶中) 50-待支付(司机抵达目的) 60-已支付(乘客已支付)
            // 70-已完成  80-已取消)
            // 订单创建失效;更新订单状态为已取消;
            String orderCode = expiredKey.trim().split(":")[2];
            if (StrUtil.isNotBlank(orderCode)) {
                orderInfoService.updateOrderStatus(orderCode, CommonKey.ORDER_STATUS_80.getValue());
                log.info("[{}]订单失效key->{},更新订单状态为已取消", orderCode, expiredKey);
            }

        }
        // 判断支付订单过期Key
        else if (expiredKey.indexOf(RedisKey.ORDER_PAY_INFO.getValue()) > 0) {
            // 支付状态(10-订单创建(待支付) 20-支付中 30-支付成功
            // 40-支付失败 50-支付取消 60-申请退款)
            String orderCode = expiredKey.trim().split(":")[2];
            log.info("[{}]支付订单失效key->{},更新支付状态为支付失败", orderCode, expiredKey);
        }
    }
}
